/**
 * 获取应用的基础URL
 * 在服务端和客户端都能正确工作
 * @param request - 可选的请求对象，用于从请求头动态获取域名
 */
export function getBaseUrl(request?: Request | { headers: { get: (name: string) => string | null } }): string {
  // 在客户端环境中，直接使用当前页面的origin
  if (typeof window !== 'undefined') {
    return window.location.origin
  }
  
  // 在服务端环境中
  // 1. 优先使用环境变量
  if (process.env.NEXT_PUBLIC_APP_URL) {
    return process.env.NEXT_PUBLIC_APP_URL
  }
  
  // 2. 使用Vercel环境变量（如果部署在Vercel上）
  if (process.env.VERCEL_URL) {
    return `https://${process.env.VERCEL_URL}`
  }

  // 3. 从请求头动态获取（如果提供了请求对象）
  if (request && request.headers) {
    const host = request.headers.get('host')
    const protocol = request.headers.get('x-forwarded-proto') ||
                    request.headers.get('x-forwarded-protocol') ||
                    (request.headers.get('x-forwarded-ssl') === 'on' ? 'https' : 'http')

    if (host) {
      // 确保使用正确的协议
      const finalProtocol = host.includes('localhost') ? 'http' : protocol
      return `${finalProtocol}://${host}`
    }
  }

  // 4. 尝试从其他环境变量获取（如果在服务端）
  if (process.env.NODE_ENV === 'production') {
    // 生产环境：尝试从不同来源获取域名
    const host = process.env.HOST || process.env.HOSTNAME
    if (host) {
      return `https://${host}`
    }

    // 如果都没有，返回一个警告并使用localhost
    console.warn('⚠️  生产环境未配置域名，请设置 NEXT_PUBLIC_APP_URL 环境变量')
    return 'https://localhost:3000'
  }

  // 4. 开发环境默认值
  return 'http://localhost:3000'
}

/**
 * 构建工具的完整URL
 * @param deployPath 工具的部署路径
 * @param request - 可选的请求对象，用于动态获取域名
 */
export function buildToolUrl(deployPath: string, request?: Request): string {
  const baseUrl = getBaseUrl(request)
  // 确保路径以 / 开头
  const path = deployPath.startsWith('/') ? deployPath : `/${deployPath}`
  return `${baseUrl}${path}`
}

/**
 * 构建API的完整URL
 * @param apiPath API路径
 * @param request - 可选的请求对象，用于动态获取域名
 */
export function buildApiUrl(apiPath: string, request?: Request): string {
  const baseUrl = getBaseUrl(request)
  // 确保路径以 / 开头
  const path = apiPath.startsWith('/') ? apiPath : `/${apiPath}`
  return `${baseUrl}/api${path}`
}
